# %%
import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt

# %%
# -------------------绘制直方图-------------------
# 读取图片灰度
img = cv.imread('scenery.png', cv.IMREAD_GRAYSCALE)

# 计算直方图
hist = cv.calcHist([img], [0], None, [256], [0, 255]) 
# 图像，通道（0表示灰度通道），掩膜（None表示全图），横轴数值大小，纵轴范围（像素灰度值范围）

# 绘制直方图
plt.figure(figsize=(10, 5),dpi=100) # 设置画布大小。（宽，高）,分辨率
plt.plot(hist) # 绘制直方图
plt.grid(True) # 显示网格


cv.imshow('image', img) # 显示图像
cv.waitKey(0)
plt.show() # 显示图像
cv.destroyAllWindows()

# %%
# -------------------掩膜操作------------------
# 读取图片灰度
img = cv.imread('scenery.png', cv.IMREAD_GRAYSCALE)

 # 创建大小为原图大小的蒙版
mask = np.zeros(img.shape[0:2], np.uint8) #全黑色的图像
mask[100:400, 100:400] = 255 # 设定蒙版区域为白色

 # 应用蒙版
masked_img = cv.bitwise_and(img, img, mask=mask) 
#第一个参数是原图，第二个参数是原图，第三个参数是掩膜的应用方式

# 计算直方图
hist = cv.calcHist([img], [0], mask, [256], [0, 255]) 

plt.figure(figsize=(10, 5),dpi=100) # 设置画布大小。（宽，高）,分辨率
plt.plot(hist) # 绘制直方图
plt.grid(True) # 显示网格


cv.imshow('image', masked_img) # 显示图像
cv.waitKey(0)
plt.show() # 显示图像
cv.destroyAllWindows()

# %%
# -------------------直方图均衡化----------------------------
# 将直方图拉伸，使其均匀分布，使图像的对比度增强
img = cv.imread('scenery.png', cv.IMREAD_GRAYSCALE)

dst = cv.equalizeHist(img) # 直方图均衡化
#自适应直方图均衡化。原理是分成小块，对每个小块进行直方图均衡化，然后再合并。
dst2 = cv.createCLAHE(clipLimit=2.0, tileGridSize=(8,8)).apply(img) # 对比度限制，小块数量（默认8x8）

cv.imshow('Original image', img) # 显示图像
cv.imshow('Equalized image', dst) # 显示图像
cv.imshow('Adaptive Equalized image', dst2) # 显示图像
cv.waitKey(0)
cv.destroyAllWindows()

# %%